package com.simpou.commons.utils.pagination;

import com.simpou.commons.utils.validation.Assertions;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;

import java.io.Serializable;
import lombok.NoArgsConstructor;

/**
 * Configuração de uma paginação.
 *
 * @author Jonas Pereira
 * @since 2011-07-12
 * @version 2012-07-16
 */
@Getter
@EqualsAndHashCode
@ToString
@NoArgsConstructor
public final class PaginationConfig implements Cloneable, Serializable {

    /**
     * Quantidade máxima de elementos a serem exibidos por página.
     */
    private int pageSize;

    /**
     * Quantidade de elementos.
     */
    private long elements;

    /**
     * Quantidade máxima de páginas a serem exibidas na lista de páginas
     * diretamente acessíveis.
     */
    private int pagesToShow;

    /**
     * Inicializa campos.
     *
     * @param pageSize Quantidade máxima de elementos a serem exibidos por
     * página.
     * @param elements Quantidade de elementos.
     * @param pagesToShow Quantidade máxima de páginas a serem exibidas na lista
     * de páginas diretamente acessíveis,
     */
    public PaginationConfig(final int pageSize, final long elements,
            final int pagesToShow) {
        setPageSize(pageSize);
        setElements(elements);
        setPagesToShow(pagesToShow);
    }

    /**
     * @param elements Quantidade de elementos. Deve ser maior que zero.
     */
    public void setElements(final long elements) {
        this.elements = Assertions.greaterThan(elements, 0L);
    }

    /**
     * @param pageSize Quantidade máxima de elementos a serem exibidos por
     * página. Deve ser maior que zero.
     */
    public void setPageSize(final int pageSize) {
        this.pageSize = Assertions.greaterThan(pageSize, 0);
    }

    /**
     * @param pagesToShow Quantidade máxima de páginas a serem exibidas na lista
     * de páginas diretamente acessíveis. Deve ser maior que zero.
     */
    public void setPagesToShow(final int pagesToShow) {
        this.pagesToShow = Assertions.greaterThan(pagesToShow, 0);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public PaginationConfig clone() {
        PaginationConfig clone = new PaginationConfig();
        clone.elements = elements;
        clone.pageSize = pageSize;
        clone.pagesToShow = pagesToShow;
        return clone;
    }
}
